package com.xinqi.common.core.validate.sensitive;

import com.xinqi.common.core.utils.StringUtils;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;

public class CheckSensitiveFiled {

    /**
     * 判断类属性是否有敏感词
     *
     * @param t
     * @param <T>
     * @throws RuntimeException
     */
    public static <T> void checkSensitiveFiled(T t) throws RuntimeException, IllegalAccessException {

        if (null == t) {
            throw new RuntimeException("obj is null");
        }
        //获取class对象
        Class<?> aClass = t.getClass();
        //获取当前对象所有属性  使用带Declared的方法可访问private属性
        Field[] declaredFields = aClass.getDeclaredFields();
        //遍历对象属性
        for (Field field : declaredFields) {
            //开启访问权限
            field.setAccessible(true);
            //使用此方法 field.get(Object obj) 可以获取  当前对象这个列的值
            Object o = field.get(t);
            Annotation annotation = field.getDeclaredAnnotation(Sensitive.class);
            //如果没有设置当前注解 不用校验
            if (annotation == null) {
                continue;
            }
            //获取注解接口对象
            Sensitive sensitive = (Sensitive) annotation;
            //如果设置了当前注解，但是没有值，抛出异常
            if (o == null) {
                // 添加判断逻辑
                if (StringUtils.isNotBlank(sensitive.message())) {
                    //设置了注解message值 直接返回
                    throw new RuntimeException(sensitive.message());
                }
            }
        }
    }

}
